package com.ruoyi.quartz.util;

import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESedeKeySpec;
import javax.crypto.spec.IvParameterSpec;
import java.util.Base64;
/**
 * @author TsingYu
 * @version 1.0
 * @date 2025/8/19 08:42
 */
public class TripleDesUtils {
    // 3DES算法名称（CBC模式+PKCS5Padding填充）
    private static final String ALGORITHM = "ECB";
    // 密钥（168位=21字节，或112位=14字节，此处示例为14字节=112位）
    private static final String SECRET_KEY = "553036673260679053754558"; // 14字节，对应K1=前8字节，K2=中间8字节，K3=后8字节（K1=K3）
    // 初始向量IV（64位=8字节，CBC模式必须）
    private static final String IV = ""; // 8字节

    /**
     * 3DES加密
     * @param plainText 明文（字符串）
     * @return 加密后Base64编码的字符串
     */
    public static String encrypt(String plainText) throws Exception {
        // 1. 转换密钥和IV为字节数组
        byte[] keyBytes = SECRET_KEY.getBytes();
        byte[] ivBytes = IV.getBytes();

        // 2. 生成3DES密钥
        DESedeKeySpec keySpec = new DESedeKeySpec(keyBytes);
        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DESede");
        SecretKey secretKey = keyFactory.generateSecret(keySpec);

        // 3. 初始化加密器（CBC模式需传入IV）
        Cipher cipher = Cipher.getInstance(ALGORITHM);
        IvParameterSpec ivSpec = new IvParameterSpec(ivBytes);
        cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivSpec);

        // 4. 加密明文（先转字节数组，再加密，最后Base64编码）
        byte[] encryptedBytes = cipher.doFinal(plainText.getBytes("UTF-8"));
        return Base64.getEncoder().encodeToString(encryptedBytes);
    }

    /**
     * 3DES解密
     * @param encryptedText 加密后Base64编码的字符串
     * @return 解密后的明文（字符串）
     */
    public static String decrypt(String encryptedText) throws Exception {
        // 1. 转换密钥、IV为字节数组，解密Base64密文
        byte[] keyBytes = SECRET_KEY.getBytes();
        byte[] ivBytes = IV.getBytes();
        byte[] encryptedBytes = Base64.getDecoder().decode(encryptedText);

        // 2. 生成3DES密钥（与加密一致）
        DESedeKeySpec keySpec = new DESedeKeySpec(keyBytes);
        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DESede");
        SecretKey secretKey = keyFactory.generateSecret(keySpec);

        // 3. 初始化解密器
        Cipher cipher = Cipher.getInstance(ALGORITHM);
        IvParameterSpec ivSpec = new IvParameterSpec(ivBytes);
        cipher.init(Cipher.DECRYPT_MODE, secretKey, ivSpec);

        // 4. 解密（先解密字节数组，再转字符串）
        byte[] decryptedBytes = cipher.doFinal(encryptedBytes);
        return new String(decryptedBytes, "UTF-8");
    }

    // 测试
    public static void main(String[] args) throws Exception {
        String plainText = "Hello 3DES!";
        // 加密
        String encrypted = encrypt(plainText);
        System.out.println("加密后（Base64）：" + encrypted);
        // 解密
        String decrypted = decrypt(encrypted);
        System.out.println("解密后：" + decrypted);
    }
}
